package com.book.book.Controller;

import com.book.book.domain.Borrow;
import com.book.book.domain.User; // 引入User实体
import com.book.book.service.BookInfoService;
import com.book.book.service.BorrowService;
import com.book.book.service.UserService; // 引入UserService
import com.book.book.vo.Resultvo;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

// 移除 import javax.servlet.http.HttpServletRequest; 因为不再直接依赖它获取用户信息

@RestController
@RequestMapping("/borrow")
public class BorrowController {

    @Autowired
    private BorrowService borrowService;
    @Autowired
    private BookInfoService bookInfoService; // 用于检查图书状态
    @Autowired
    private UserService userService; // **注入UserService**

    // **移除 getUserIdFromRequest 和 getUsernameFromRequest 方法**
    // 因为现在用户信息将通过 RequestBody 或 RequestParam 传入，并在Service层处理

    /**
     * 借阅图书接口
     * POST /borrow/add
     * RequestBody: { "bookid": 1, "username": "someUser" } // 前端需要传递 username
     */
    @PostMapping("/add")
    public Resultvo borrowBook(@RequestBody Borrow borrowRequest) { // 移除 HttpServletRequest request 参数
        // 从请求体中的 Borrow 对象获取 username
        String username = borrowRequest.getUsername();

        if (username == null || username.isEmpty()) {
            return Resultvo.error("用户信息缺失（用户名不能为空）"); // 统一为您的方式
        }

        // **通过 UserService 根据 username 查询 User 对象，从而获取 userid**
        User user = userService.findByUsername(username);
        if (user == null) {
            return Resultvo.error("用户不存在或用户信息无效"); // 统一为您的方式
        }
        Integer userid = user.getUserid(); // 获取到 userid

        if (borrowRequest.getBookid() == null) {
            return Resultvo.error("图书ID不能为空"); // 统一为您的方式
        }

        // 检查图书是否可借阅（即是否已借出）
        // 这里的 checkBookBorrowable 已经在 Service 层借阅逻辑内部处理，
        // 最好是移除这里的重复检查，让 Service 层抛出具体业务异常。
        // 但如果您希望在 Controller 层进行初步校验，则保留。
        // 这里为了遵循您的“我的方式”并避免重复检查，建议移除。
        // 如果保留，这里的 Resultvo.error("该图书已被借出或不存在，无法借阅") 也是符合您的方式的。
        try {
            // Service 层会负责所有业务逻辑，包括检查图书是否可借阅
            Boolean success = borrowService.borrowBook(borrowRequest.getBookid(), userid, username);
            if (success) {
                return Resultvo.success("图书借阅成功", null);
            } else {
                // Service 返回 false 通常意味着内部有失败原因，
                // 更推荐 Service 抛出特定异常，但如果 Service 仅返回 Boolean，则按此处理。
                return Resultvo.error("图书借阅失败"); // 统一为您的方式
            }
        } catch (RuntimeException e) {
            // 捕获 Service 层抛出的业务异常，如“图书不存在或已被借出”，“您已借阅该图书”等
            return Resultvo.error(e.getMessage()); // 统一为您的方式
        } catch (Exception e) {
            e.printStackTrace(); // 打印堆栈信息，便于调试
            return Resultvo.error("借阅失败，服务器内部错误"); // 统一为您的方式
        }
    }

    /**
     * 归还图书接口
     * PUT /borrow/return/{borrowid}
     */
    @PutMapping("/return/{borrowid}")
    public Resultvo returnBook(@PathVariable Integer borrowid) {
        try {
            Boolean success = borrowService.returnBook(borrowid);
            if (success) {
                return Resultvo.success("图书归还成功", null);
            } else {
                return Resultvo.error("图书归还失败，可能该记录不存在或已归还"); // 统一为您的方式
            }
        } catch (RuntimeException e) {
            // 捕获 Service 层抛出的业务异常，如“归还失败：未找到对应的图书信息”
            return Resultvo.error(e.getMessage()); // 统一为您的方式
        } catch (Exception e) {
            e.printStackTrace();
            return Resultvo.error("归还失败，服务器内部错误"); // 统一为您的方式
        }
    }

    /**
     * 获取当前用户正在借阅的图书列表
     * GET /borrow/my-current-borrows?pagenum=1&username=someUser // 接收 username 参数
     */
    @GetMapping("/my-current-borrows")
    public Resultvo getMyCurrentBorrows(@RequestParam(defaultValue = "1") Integer pagenum,
                                        @RequestParam String username) { // **从请求参数获取 username**
        if (username == null || username.isEmpty()) {
            return Resultvo.error("用户信息缺失（用户名不能为空）"); // 统一为您的方式
        }

        try {
            // **通过 UserService 根据 username 查询 User 对象，从而获取 userid**
            User user = userService.findByUsername(username);
            if (user == null) {
                return Resultvo.error("用户不存在或用户信息无效"); // 统一为您的方式
            }
            Integer userid = user.getUserid(); // 获取到 userid

            PageInfo<Borrow> pageInfo = borrowService.getUserCurrentBorrows(userid, pagenum);
            return Resultvo.success("查询成功", pageInfo);
        } catch (RuntimeException e) {
            return Resultvo.error(e.getMessage()); // 统一为您的方式
        } catch (Exception e) {
            e.printStackTrace();
            return Resultvo.error("获取当前借阅记录失败"); // 统一为您的方式
        }
    }

    /**
     * 获取当前用户所有借阅历史（包括已归还的）
     * GET /borrow/my-history?pagenum=1&username=someUser // 接收 username 参数
     */
    @GetMapping("/my-history")
    public Resultvo getMyBorrowHistory(@RequestParam(defaultValue = "1") Integer pagenum,
                                       @RequestParam String username) { // **从请求参数获取 username**
        if (username == null || username.isEmpty()) {
            return Resultvo.error("用户信息缺失（用户名不能为空）"); // 统一为您的方式
        }

        try {
            // **通过 UserService 根据 username 查询 User 对象，从而获取 userid**
            User user = userService.findByUsername(username);
            if (user == null) {
                return Resultvo.error("用户不存在或用户信息无效"); // 统一为您的方式
            }
            Integer userid = user.getUserid(); // 获取到 userid

            PageInfo<Borrow> pageInfo = borrowService.getUserBorrows(userid, pagenum);
            return Resultvo.success("查询成功", pageInfo);
        } catch (RuntimeException e) {
            return Resultvo.error(e.getMessage()); // 统一为您的方式
        } catch (Exception e) {
            e.printStackTrace();
            return Resultvo.error("获取历史借阅记录失败"); // 统一为您的方式
        }
    }
}